package practicasprolenguajes.dos;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Stack;
import java.util.Vector;

public class Analizador {
	String reaux;
	public Stack<Integer> pila; 
	private File fichero; 
	private FileReader fr;
	private BufferedReader br;
	private int c;
	private ArrayList<Bloque> bloques;
	private Encontradas enco;
	Fichero f;
	/**
	 * @param args
	 */
	public Analizador()
	{
		reaux = "";
		pila = new Stack<Integer>();
		fichero = null;
		fr = null;
		br = null;
		bloques = new ArrayList<Bloque>();
		f = new Fichero();
		c = -1;
		enco = new Encontradas();
	}

	public File getFichero() {
		return fichero;
	}
	public void setFichero(File fichero) {
		this.fichero = fichero;
	}
	public FileReader getFr() {
		return fr;
	}
	public void setFr(FileReader fr) {
		this.fr = fr;
	}
	public BufferedReader getBr() {
		return br;
	}
	public void setBr(BufferedReader br) {
		this.br = br;
	}
	
	public boolean analizarfichero() throws IOException {
		fichero = new File("Codigo2.java");
		fr = new FileReader(fichero);
		br = new BufferedReader(fr);
		int cbloque = 0;
		f.leerficheroSimbolos();
    	f.leerpalabras();
    	String aux = ""; 
    	int contador = 1;
    	
    	System.out.println("Vamos a entrar en el While");
    	
		while(( c = br.read()) !=  -1 )
		{
			if ((((char)c)!= '\n') && (((char)c) != '\t'))
			{
				
				if(f.Getsimb().getSimbolos().contains(((char)c)))
				{
					aux += ((char)c);	
				}
				else
				{
					if (!f.Getsimb().getSimbolos_p().contains(((char)c))) {
		    			System.out.println("Error! Símbolo "+ ((char)c) +
		    					           " no contenido en fichero de símbolos");
		    			return false;
		    		}
		    		else {
		    			if (f.Getpalres().GetReserv().contains(aux)) {
		    				
	    					enco.insertar(aux, contador);
	
		    			}
		    			aux = "";
		    		}
				}
				
			
				if (((char)c) == '{')
				{
					pila.push(contador);
					cbloque = cbloque + 1;
				}
				if(((char)c) == '}')
				{
					if (pila.empty() != true)
					{	
						Bloque baux = new Bloque();
						int l = pila.pop();
						baux.setInicio(l);
						baux.setFin(contador);
						baux.setProf(cbloque);
						bloques.add(baux);
						cbloque = cbloque - 1;
					}
				}
				
			}
			if(((char)c) == '\n')
			{
				
				contador += 1;
			}
		}
		
		
		
		for(int i = 0; i < bloques.size(); i++)
		{
			System.out.println("Bloque  " + i + " : desde: ");
			System.out.println(bloques.get(i).getInicio());
			System.out.println("hasta :");
			System.out.println(bloques.get(i).getFin());
			System.out.println("Profundidad :" + bloques.get(i).getProf());
		}
		
		br.close();
		enco.mostrar();
		return true;
	}

	public ArrayList<Bloque> getBloques() {
		return bloques;
	}

	public void setBloques(ArrayList<Bloque> bloques) {
		this.bloques = bloques;
	}

	public Encontradas getEnc() {
		return enco;
	}

	public void setEnc(Encontradas enc) {
		this.enco = enc;
	}	

}
